{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 浮点数\n",
    "\n",
    "> 浮点数是与定点数相对的概念，计算机中的定点数约定小数点的位置不变，即人为约定俗成地规定了小数点的位置。例如定点纯整数约定了小数点在数值位的最后。定点纯小数约定了数值位的最高位在小数点后面。\n",
    "\n",
    "由于计算机字长的限制，当需要表示的数据有很大的数值范围时，他们不能直接用定点小数或者定点整数表示。\n",
    "\n",
    "```{rubric} 浮点数的形式\n",
    "```\n",
    "浮点数由尾数 $M$ 和阶码 $E$ 构成。基数为 $2$ 的数 $F$ 的浮点数表示为：\n",
    "\n",
    "$$\n",
    "F = M * 2^E\n",
    "$$\n",
    "\n",
    "尾数 $M$ 必须为小数，用 $n+1$ 位有符号定点小数表示，可采用原码，补码。阶码 $E$ 必须为整数，用 $k+1$ 位有符号定点整数表示，可采用原码，补码，移码。浮点数编码的位数 $m=(n+1)+(k+1)$。\n",
    "\n",
    "阶符|阶码数值部分|数符|尾数数值部分\n",
    ":-|:-|:-|:-\n",
    "$1$|$k$|$1$|$n$\n",
    "\n",
    "```{note}\n",
    "- **阶码** 是整数，其位数 $k+1$ 决定了浮点数表示的数值范围，也就是决定了数据的大小，或小数点在数据中的真实位置。阶码越长，所能表示的范围越大。\n",
    "- **阶符** 决定阶码的正负。\n",
    "- **尾数** 是小数，其位数 $n+1$ 决定了浮点数的精度，如果尾数采用小数且位数 $n$ 足够长，则当浮点数运算需要对尾数运算结果舍入时，造成的数据精度损失会比较小。即尾数越长，所能表示的精度越高。尾数的符号表示浮点数的正负。\n",
    "```\n",
    "\n",
    "## 非规格化浮点数\n",
    "\n",
    "当对尾数 $M$ 只要求是小数而无其他限制时，此时的浮点数被称为 **非规格化浮点数**。假设阶码和尾数都用补码表示，则非规格化浮点数可表示的范围如下：\n",
    "\n",
    "阶码和尾数|数值|阶码和尾数|数值\n",
    ":-|:-|:-|:-\n",
    "阶码最小值|$-2^k$|阶码最大值|$2^k - 1$\n",
    "尾数最小负值|$-1$|尾数最大负值|$-2^{-n}$\n",
    "尾数最小正值|$+2^n$|尾数最大正值|$+(1 - 2^{-n})$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以 8 位数值位，一位符号位的阶码为例子： \n",
    "\n",
    "由于用补码表示，所以阶码的最小值应该为：`1 00000000` 即 $-2^8 = -256$；而阶码的最大值应为：`0 11111111` 即 $2^8-1 = 255$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.8.10 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.8.10"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
